package com.blkj.iam.system.model.entity;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.*;
import com.blkj.iam.system.model.dto.TransPermissionDTO;
import com.blkj.iam.system.model.vo.ShowPermissionVO;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

/**
 * 菜单实体
 *
 * @author Ray.Hao
 * @since 2023/3/6
 */
@TableName("sys_menu")
@Getter
@Setter
public class Menu {
    /**
     * 菜单ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 父菜单ID
     */
    private Long parentId;

    /**
     * 菜单名称
     */
    private String name;

    /**
     * 菜单类型(1-菜单；2-目录；3-外链；4-按钮权限)
     */
    private Integer type;

    /**
     * 路由名称（Vue Router 中定义的路由名称）
     */
    private String routeName;

    /**
     * 路由路径（Vue Router 中定义的 URL 路径）
     */
    private String routePath;

    /**
     * 组件路径(vue页面完整路径，省略.vue后缀)
     */
    private String component;

    /**
     * 权限标识
     */
    private String perm;

    /**
     * 权限策略 1:显示 2:禁用
     */
    private String permType;

    /**
     * 显示状态(1:显示;0:隐藏)
     */
    private Integer visible;

    /**
     * 排序
     */
    private Integer sort;

    /**
     * 菜单图标
     */
    private String icon;

    /**
     * 跳转路径
     */
    private String redirect;

    /**
     * 父节点路径，以英文逗号(,)分割
     */
    private String treePath;

    /**
     * 【菜单】是否开启页面缓存(1:开启;0:关闭)
     */
    private Integer keepAlive;

    /**
     * 【目录】只有一个子路由是否始终显示(1:是 0:否)
     */
    private Integer alwaysShow;

    /**
     * 路由参数
     */
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String params;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 租户ID
     */
    private Long tenantId;

    /**
     * 雪花ID
     */
    private String idStr;

    /**
     * 父节点雪花ID
     */
    private String parentIdStr;

    /**
     * 是否路由菜单: 0:不是  1:是
     */
    private Integer route;

    /**
     * 按钮权限状态(0:无效 1:有效)
     */
    private Integer status;

    /**
     * 是否路由客户端菜单 1-是 0-否
     */
    private Integer clientRoute;

    /**
     * 租户是否可见 1-是 0-否
     */
    private Integer tenantShow;

    /**
     * 创建者
     */
    @TableField(exist = false)
    private String createUser;

    /**
     * 修改者
     */
    @TableField(exist = false)
    private String updateUser;


    // 转成
    public static ShowPermissionVO toShowPermission(Menu menu) {
        ShowPermissionVO vo = new ShowPermissionVO();
        String menuPath = menu.getRoutePath();
        String menuComponent = menu.getComponent();
        String icon = menu.getIcon();
        vo.setName(menu.getRouteName());
        vo.setComponent(menuComponent);
        vo.setPath(menuPath);
        vo.setId(menu.getId());
        vo.setRedirect(menu.getRedirect());
        vo.setRoute(String.valueOf(menu.getRoute()));
        vo.setSort(menu.getSort());

        ShowPermissionVO.Meta meta = new ShowPermissionVO.Meta();
        meta.setTitle(menu.getName());
        if (ObjectUtil.isNotEmpty(menuComponent)) {
            meta.setComponentName(menuComponent.substring(menuComponent.lastIndexOf("/") + 1));
        }
        if (ObjectUtil.isNotEmpty(icon)) {
            meta.setIcon(icon);
        }
        meta.setInternalOrExternal(false);
        meta.setKeepAlive(false);
        vo.setMeta(meta);
        return vo;
    }

    // 转成
    public static TransPermissionDTO toTransPermission(Menu menu) {
        TransPermissionDTO dto = new TransPermissionDTO();
        dto.setId(menu.getId().toString());
        dto.setParentId(menu.getParentIdStr());
        dto.setName(menu.getName());
        dto.setPerms(menu.getPerm());
        dto.setPermsType(menu.getPermType());
        dto.setIcon(menu.getIcon());
        dto.setComponent(menu.getComponent());
        dto.setComponentName(menu.getRouteName());
        dto.setUrl(menu.getRoutePath());
        dto.setRedirect(menu.getRedirect());
        dto.setSortNo(Double.valueOf(menu.getSort()));
        // 菜单类型(1-菜单；2-目录；3-外链；4-按钮权限)
        // 类型（0：一级菜单；1：子菜单 ；2：按钮权限）
        Integer menuType = menu.getType();
        if (menuType == 1) {
            dto.setMenuType(1);
        } else if (menuType == 2) {
            dto.setMenuType(0);
        } else if (menuType == 4) {
            dto.setMenuType(2);
        }
        Long parentId1 = menu.getParentId();
        if (ObjectUtil.isEmpty(parentId1)) {
            dto.setLeaf(true);
        } else {
            dto.setLeaf(false);
        }
        dto.setRoute(menu.getRoute() == 1);
        dto.setKeepAlive(menu.getKeepAlive() == 1);
        dto.setCreateBy(menu.getCreateUser());
        if (menu.getStatus().equals(1)) {
            dto.setDelFlag(0);
        } else {
            dto.setDelFlag(1);
        }
        dto.setRuleFlag(0);
        if (menu.getVisible() == 1) {
            dto.setHidden(false);
        } else {
            dto.setHidden(true);
        }
        dto.setHideTab(false);
        dto.setCreateTime(menu.getCreateTime());
        dto.setUpdateBy(menu.getUpdateUser());
        dto.setUpdateTime(menu.getUpdateTime());
        dto.setStatus(menu.getStatus().toString());
        dto.setAlwaysShow(menu.getAlwaysShow() == 1);
        dto.setInternalOrExternal(false);
        dto.setIdStr(menu.getIdStr());
        return dto;
    }
}